lib: Add a public helper method for pruning to find all ref'd commits
authorColin Walters <walters@verbum.org>
Mon, 30 Apr 2018 14:31:33 +0000 (14:31 +0000)
committerAtomic Bot <atomic-devel@projectatomic.io>
Thu, 24 May 2018 12:56:11 +0000 (12:56 +0000)
Prep for reworking how we do sysroot cleanup.  We're going to
start doing more lowlevel pruning work there, and I wanted to avoid
duplicating the ref enumeration.

Closes: #1566
Approved by: jlebon

apidoc/ostree-sections.txt
src/libostree/libostree-devel.sym
src/libostree/ostree-repo-prune.c
src/libostree/ostree-repo.h

index 5162b2f741822017e19e8f53c8dc3628b8b33a25..6d4a3423aaa086deb51fe4066c663892dda62828 100644 (file)
@@ -413,6 +413,7 @@ ostree_repo_commit_traverse_iter_next
 OstreeRepoPruneFlags
 ostree_repo_prune
 ostree_repo_prune_static_deltas
+ostree_repo_traverse_reachable_refs
 ostree_repo_prune_from_reachable
 OstreeRepoPullFlags
 ostree_repo_pull
index b217e3e57e5418129200feaa313ec3ff40defea0..eb3b32117d08d678514d38ca8c8662615e487872 100644 (file)
@@ -19,6 +19,7 @@
 
 /* Add new symbols here.  Release commits should copy this section into -released.sym. */
 LIBOSTREE_2018.6 {
+  ostree_repo_traverse_reachable_refs;
 } LIBOSTREE_2018.5;
 
 /* Stub section for the stable release *after* this development one; don't
index 4c883542234c9ddefcefef9f5aa20261f4209160..b93d35acf6c1efabc5c5d57231c05ebdc03a7e8e 100644 (file)
@@ -301,6 +301,64 @@ repo_prune_internal (OstreeRepo        *self,
   return TRUE;
 }
 
+/**
+ * ostree_repo_traverse_reachable_refs:
+ * @self: Repo
+ * @depth: Depth of traversal
+ * @reachable: (element-type GVariant GVariant): Set of reachable objects (will be modified)
+ * @cancellable: Cancellable
+ * @error: Error
+ *
+ * Add all commit objects directly reachable via a ref to @reachable.
+ *
+ * Locking: shared
+ * Since: 2018.6
+ */
+gboolean
+ostree_repo_traverse_reachable_refs (OstreeRepo *self,
+                                     guint       depth,
+                                     GHashTable *reachable,
+                                     GCancellable *cancellable,
+                                     GError      **error)
+{
+  g_autoptr(OstreeRepoAutoLock) lock =
+    _ostree_repo_auto_lock_push (self, OSTREE_REPO_LOCK_SHARED, cancellable, error);
+  if (!lock)
+    return FALSE;
+
+  /* Ignoring collections. */
+  g_autoptr(GHashTable) all_refs = NULL;  /* (element-type utf8 utf8) */
+
+  if (!ostree_repo_list_refs (self, NULL, &all_refs,
+                              cancellable, error))
+    return FALSE;
+
+  GLNX_HASH_TABLE_FOREACH_V (all_refs, const char*, checksum)
+    {
+      g_debug ("Finding objects to keep for commit %s", checksum);
+      if (!ostree_repo_traverse_commit_union (self, checksum, depth, reachable,
+                                              cancellable, error))
+        return FALSE;
+    }
+
+  /* Using collections. */
+  g_autoptr(GHashTable) all_collection_refs = NULL;  /* (element-type OstreeChecksumRef utf8) */
+
+  if (!ostree_repo_list_collection_refs (self, NULL, &all_collection_refs,
+                                         OSTREE_REPO_LIST_REFS_EXT_EXCLUDE_REMOTES, cancellable, error))
+    return FALSE;
+
+  GLNX_HASH_TABLE_FOREACH_V (all_collection_refs, const char*, checksum)
+    {
+      g_debug ("Finding objects to keep for commit %s", checksum);
+      if (!ostree_repo_traverse_commit_union (self, checksum, depth, reachable,
+                                              cancellable, error))
+        return FALSE;
+    }
+
+  return TRUE;
+}
+
 /**
  * ostree_repo_prune:
  * @self: Repo
@@ -355,35 +413,8 @@ ostree_repo_prune (OstreeRepo        *self,
 
   if (refs_only)
     {
-      /* Ignoring collections. */
-      g_autoptr(GHashTable) all_refs = NULL;  /* (element-type utf8 utf8) */
-
-      if (!ostree_repo_list_refs (self, NULL, &all_refs,
-                                  cancellable, error))
-        return FALSE;
-
-      GLNX_HASH_TABLE_FOREACH_V (all_refs, const char*, checksum)
-        {
-          g_debug ("Finding objects to keep for commit %s", checksum);
-          if (!ostree_repo_traverse_commit_union (self, checksum, depth, reachable,
-                                                  cancellable, error))
-            return FALSE;
-        }
-
-      /* Using collections. */
-      g_autoptr(GHashTable) all_collection_refs = NULL;  /* (element-type OstreeChecksumRef utf8) */
-
-      if (!ostree_repo_list_collection_refs (self, NULL, &all_collection_refs,
-                                             OSTREE_REPO_LIST_REFS_EXT_EXCLUDE_REMOTES, cancellable, error))
+      if (!ostree_repo_traverse_reachable_refs (self, depth, reachable, cancellable, error))
         return FALSE;
-
-      GLNX_HASH_TABLE_FOREACH_V (all_collection_refs, const char*, checksum)
-        {
-          g_debug ("Finding objects to keep for commit %s", checksum);
-          if (!ostree_repo_traverse_commit_union (self, checksum, depth, reachable,
-                                                  cancellable, error))
-            return FALSE;
-        }
     }
 
   if (!ostree_repo_list_objects (self, OSTREE_REPO_LIST_OBJECTS_ALL | OSTREE_REPO_LIST_OBJECTS_NO_PARENTS,
index 8d3a7a6f20c2390195f240ef5a2b31ec613d70c0..d86d241e35106f93417a1921a8abed065dc8e97f 100644 (file)
@@ -1202,6 +1202,14 @@ struct _OstreeRepoPruneOptions {
 
 typedef struct _OstreeRepoPruneOptions OstreeRepoPruneOptions;
 
+_OSTREE_PUBLIC
+gboolean
+ostree_repo_traverse_reachable_refs (OstreeRepo *self,
+                                     guint       depth,
+                                     GHashTable *reachable,
+                                     GCancellable *cancellable,
+                                     GError      **error);
+
 _OSTREE_PUBLIC
 gboolean ostree_repo_prune_from_reachable (OstreeRepo             *self,
                                            OstreeRepoPruneOptions *options,